package com.niit.springbootshop.tools;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class ImageUtil {
	// 全部界面 验证码 字典
	String WORDS="abcdefghijkmnpqrstuvwxyz23456789";
	Random random = new Random(); // Random 用于生成各种随机内容

	/**
	 * 生成4位随机验证码 拼接成字符串
	 * @return
	 */
	public String getCode() {
		StringBuilder code = new StringBuilder();// 字符串工具类 拼接字符串省内存
		for(int i=0;i<4;i++) {
			int index = random.nextInt(WORDS.length()); //随机一个索引
			char c = WORDS.charAt(index);// 一个char从字符串中取出
			code.append(c); //拼接到 结果字符串中
		}
		return code.toString();
	}

	/**
	 * 随机生成颜色
	 * @return
	 */
	public Color getColor(int start, int max) { // start=200  max=50
		int r = start + random.nextInt(max);  // 100-150  150-200  200-250
		int g = start + random.nextInt(max);  // 100-150  150-200  200-250
		int b = start + random.nextInt(max);  // 100-150  150-200  200-250
		return new Color(r,g,b)  ;
	}

	/**
	 * 绘制验证码
	 * @param request
	 * @param response
	 */
	public void drawCode(HttpServletRequest request, HttpServletResponse response) {

		// 1. 调用方法 生成四位的验证码
		String code = getCode();

		// 每次生成的验证码都要在session中备份
		// Http协议 "无状态"
		// 保持用户和服务器连接状态 "会话"
		// redis
		HttpSession session = request.getSession();
		session.setAttribute("VCODE", code);

		int width = 110;
		int height = 25;

		// 图片对象，验证码就需要绘制到 这个对象里面
		BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

		// "画笔"
		Graphics2D g = image.createGraphics(); // 获取"画笔"
		// 绘制背景
		// 设置颜色
		g.setColor(getColor(200,55)); // 颜色取值 200-255
		// 绘制矩形
		g.fillRect(0, 0, width, height); // 背景的大小 跟 image一样

		// 绘制验证码
		for(int i=0;i<code.length();i++) {
			Graphics2D g2d = (Graphics2D)g.create();
			g2d.setColor(getColor(0,150));
			g2d.setFont(new Font("宋体",Font.BOLD,24));// 设置字体的参数
			g2d.translate(20*i+15, 15); // 确定字的位置
//			if(random.nextBoolean()) { // 随机true或者false
//				g2d.rotate(30*Math.PI/180); // 旋转
//			}else {
//				g2d.rotate(-30*Math.PI/180); // 旋转
//			}
			// 绘制这个字
			g2d.drawString(code.charAt(i)+"", 0, 0);
			// g.drawString(code.charAt(i)+"", 50, 0);
		}
//
//		// 绘制5条干扰线
//		for(int i=0;i<5;i++) {
//			g.setColor(getColor(100, 155));
//			int x1 = random.nextInt(width-10);
//			int x2 = random.nextInt(width-10);
//			int y1 = random.nextInt(height-10);
//			int y2 = random.nextInt(height-10);
//			g.drawLine(x1, y1, x2, y2);
//		}
//
//		// 绘制20条干扰点
//		for(int i=0;i<10;i++) {
//			g.setColor(getColor(100, 155));
//			int x = random.nextInt(width-5);
//			int y = random.nextInt(height-5);
//			int r = random.nextInt(5); //半径 0-5
//			g.fillOval(x, y, r, r);
//
//		}

		// 生产好的图片，以JPEG格式 写入到 响应的输出流里面
		try {
			ImageIO.write(image, "JPEG", response.getOutputStream());
			response.getOutputStream().flush();// 强制写入到浏览器
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
